home *** CD-ROM | disk | FTP | other *** search
/ Atari Forever 4 / Atari Forever 4.zip / Atari Forever 4.iso / SERIE_AI / AI_060 / VIRENDET.ZIP / VDET / WPROTECT / WPROTECT.S < prev    next >
Text File  |  1994-06-07  |  28KB  |  868 lines

  1. *******************************************************************************
  2. *
  3. *         >>  WPROTECT.S <<                                 V1.03    10.02.1993
  4. *
  5. *   PD © by
  6. *   P*ST:
  7. *         Christoph Conrad
  8. *         Adalbertsteinweg 113
  9. *         5100 Aachen
  10. *
  11. *         E-Mail (lieber die als P*ST) direkt über
  12. *         MAUS: Christoph Conrad @ AC3
  13. *         ...und die Gateways
  14. *         FIDO: Christoph Conrad % Maus AC3 2:242/2.6
  15. *               ACHTUNG: evt. neu 
  16. *               Christoph Conrad % Maus AC3 2:242/42.333
  17. *       USEnet: Christoph_Conrad@ac3.maus.de
  18. *     Zerberus: Christoph_Conrad%ac3@zermaus.zer
  19. *       Pronet: MAUS:AC3:Christoph_Conrad
  20. *     Internet: conrad@rama.Informatik.RWTH-Aachen.DE
  21. *               (selten, bitte keine ueberlangen Mails!)
  22. *          BTX: Seite *35008024#, im Formular ausfüllen
  23. *               Christoph_Conrad@AC3.MAUS.DE.UUCP
  24. *               (kostet 90 Pfennig)
  25. *
  26. * Dieses Programm liegt auch dem VIRENDETEKTOR bei, _DEM_ Virensuchprogramm
  27. * auf dem ATARI ST/TT von Volker Soehnitz @ AC. Keiner bietet mehr!
  28. * Lassen Sie sich registrieren und geniessen Schutz vor allen aktuellen
  29. * Viren durch den Updateservice.
  30. *
  31. * WProtect kann und soll weiterkopiert werden, allerdings nur
  32. * _MIT_
  33. * WPROTECT.S
  34. * WPRORSC.S
  35. * Veränderungen an Source/Programm NUR zu privaten Zwecken!!
  36. * Wer veränderte Versionen von Source oder Programm öffentlich zugänglich
  37. * macht, wird von mir ganz schönen Ärger bekommen!
  38. * WPROTECT.PRG (Unter GEM/Autoordner, durch Umbenennen auch Accessory)
  39. * WPROTECT.RSC
  40. * WPROTECT.RSD (Kuma NRCS)
  41. * WPROTECT.TXT
  42. *
  43. * Liebe Leute, diese Source entstand vor grauer Vorzeit. Also verzeiht mir
  44. * die nicht ganz so übersichtliche Programmierung.
  45. *
  46. * Im folgenden bedeute
  47. *
  48. * +  Neues Feature
  49. * -  Beseitigter Bug / Unschönheit / Inkompatibilität
  50. * ...mit Grauzonen zwischen beiden!
  51. *
  52. * History:
  53. * 0.97/f: - Sicherungslaufwerk jetzt aus _bootdev ($446)
  54. *         - _drvbits / ProtDrive / ProtDouble wird jetzt als 32 Bit behandelt
  55. *           (Laufwerke A-Z)
  56. *         - Im Accessory werden jetzt bei jeder Aktivierung die aktuellen
  57. *           Schutzwerte aus dem CurrentVec übernommen (sonst würde eine
  58. *           zwischenzeitliche Änderung über einen Programmaufruf ignoriert)
  59. *         + Nachfrage bei Sichern auf X:\AUTO\WPROTECT.PRG (X == Bootlaufwerk),
  60. *           falls Bootlaufwerk als geschützt gilt.
  61. *         + Accessory erkennt nachträglich installierten Schutz.
  62. *         + Unterstützung des VA-Protokolls (VA_START)
  63. *
  64. * Die magische Grenze...
  65. *
  66. * 1.00:   (internal release, not distributed)
  67. *         + GEM-Dialogbox
  68. *           Zum Umwandeln der Resource in Assemblerquellcode verwende
  69. *           ich RSC_TO_S.PRG von
  70. *           »Bernd Eckstein« @ AC (Shareware, 10,- die sich lohnen!)
  71. *           Version >= 1.18!! ( Hallo Bernd =:^} )
  72. *         + Erkennung des residenten Prg über Cookies anstatt XBRA
  73. *           COOKIE-Library von
  74. *           »Arnd Beissner« @ MS (PD, sehr einfach in der Anwendung)
  75. *           Version >= 1.03!!
  76. *           In Version 1.03 sind noch eine Menge bra, die sich in bra.s
  77. *           umwandeln lassen.
  78. *         + Anpassung des Resourcefiles an Letemfly von
  79. *           »Oliver Scheel« @ K (PD, 'man fliegt nicht mehr ohne...')
  80. *           Version >= 1.14!!
  81. *           Die Laufwerksbuttons 'A'-'Z' sind über ALT-A - ALT-Z erreichbar.
  82. *           UNDO entspricht dem Abbruchbutton, HELP dem Sichernbutton.
  83. *           In V1.14 verhält sich die Letemfly-form_alert-Routine bezüglich
  84. *           innerhalb der Box zentrierter Texte anders als die Original-
  85. *           AES-Routine. Dies ist ein rein kosmetisches Problem.
  86. *
  87. * Alle über MAUS E-Mail addressierbaren Leute können auch über die
  88. * Gateways erreicht werden, indem mein Name und mein Mausknoten (@AC3)
  89. * gegen ihren Namen/MAUS-Knoten ausgetauscht wird, also etwa
  90. *         FIDO: Bernd Eckstein % Maus AC @ 2:242/2.6
  91. *
  92. * 1.01:   + Für das Sichern der Konfiguration wird das Bootlaufwerk
  93. *           DGetDrv (GEMDOS 25) im Autoordner-Programm ermittelt.
  94. *         + Versionsnummer abfragbar (siehe Source Label 'Version')
  95. *         + LinksShift+[Button]Nochmal in der Critical-Error-Handler-Box
  96. *           hebt den Schreibschutz für dieses Laufwerk auf!
  97. *
  98. * 1.02:   + WPROTECT.INF-Datei auf der Wurzel des Bootlaufwerkes
  99. *           für das Speichern zu schützender Laufwerke anstatt
  100. *           im Programm selbst.
  101. *
  102. * 1.03:     Bei nachträglich installiertem Programm (Kein Autoordnerprogramm,
  103. *           WPROTECT.PRG als GEM-Programm gestartet und mindestens ein Laufwerk
  104. *           zum Schutz angemeldet):
  105. *         - Es wurde immer versucht auf A:\WPROTECT.INF zu sichern.
  106. *           Gesichert wird nun auf X:\WPROTECT.INF mit X aus _bootdev ($446).
  107. *         - Durch einen Schreibfehler blieb dann fast das ganze Programm
  108. *           resident im Speicher.
  109. *
  110. * Future Releases (* bei genügender Programierermotivation)
  111. *         * MetaDOS-Laufwerke werden evt. unterstützt
  112. *         * CPX-Modul (wenn es dazu ein vernünftiges Assembler-Toolkit gibt)
  113. *         * Kommandozeile a la
  114. *           WPROTECT +ABC-EFG schützt A/B/C, entschützt E/F/G
  115. *           und lässt den Schutzstatus aller anderen Laufwerke unangetastet
  116. *           WPROTECT ++-EF schütze alle ausser E und F
  117. *           WPROTECT --+EF entschütze alle, schütze E und F
  118. *         * Buttons [ Schütze alle ] / [ Entschütze alle ]
  119. *         + aufgeräumterer Source
  120. *         + bessere Dokumentation
  121. *
  122. * mfg chris.
  123. *
  124. * Assemblieren mit MadMac V 0.13 (uralt, aber schnell & zuverlässig)
  125. * Kommandozeile: -p wprotect
  126. *
  127. * WPRORSC.S (das umgewandelte Resourcefile) + COOKIE.S
  128. * müssen sich in demselben Verzeichnis wie WPROTECT.S befinden!
  129. *
  130. * Noch einige Bemerkungen zur RESOURCE. Die Objekte müssen mit 'Erst X, dann Y'
  131. * sortiert sein, damit die Laufwerksknöpfe aufsteigende Objektindize haben.
  132. *
  133. * In der umgewandelten Resource bezeichnet
  134. * OBJCs000    Anzahl Objekte in Baum 1
  135. * Objc000000  Label des ersten Objekts in Baum 1
  136. * Falls Ihr Resourcekonverter andere Bezeichnungen wählt, müssen Sie
  137. * diese anpassen.
  138. *
  139. *******************************************************************************
  140.  
  141. WRITE_PROTECT   EQU     -13         ; Bios-Fehlermeldung
  142. _bootdev        EQU     $446
  143. hdv_rw          EQU     $476        ; Harddisk Schreiben-Lesen
  144. _drvbits        EQU     $4C2
  145.  
  146. NrOfDrives      EQU     26
  147.  
  148.             .macro AES  func
  149.             lea         \func(pc),a0
  150.             bsr         CallAES
  151.             .endm
  152.  
  153.             .macro SupExec  func
  154.             lea         \func(pc),a0
  155.             bsr         SupExec
  156.             .endm
  157.  
  158.             .macro ZeigeAlert  func
  159.             move.l  #\func,addrin
  160.             move.w  #1,intin           ; Defaultbutton 1
  161.             AES     FormAlert
  162.             .endm
  163.  
  164.            .macro GEMDOS trpno, clean
  165.            .if \trpno != 0
  166.             move.w  #\trpno,-(sp)
  167.            .else
  168.             clr.w   -(sp)
  169.            .endif
  170.             trap    #1
  171.            .if \# = 2
  172.               .if  \clean <= 6         ; -2 wegen trpno
  173.                addq.w  #2+\clean,sp    ; .w ok, da Extension automatisch!
  174.               .else
  175.                lea     2+\clean(sp),sp
  176.               .endif
  177.            .endif
  178.            .endm
  179.  
  180.            .TEXT
  181. Anfang:     bra     Install
  182.  
  183. *---------------------------
  184. *---------------------------
  185.  
  186. Version:    DC.L    '1.03'      ; Position: -18(NewHdvRW)
  187.  
  188. AutoBootDrv:DC.W    0           ; aktuelles Laufwerk bei Autoordner-Programm
  189. * Bitstring zu schützender Laufwerke Bit 0 == A:, Bit 1 == B: etc.
  190. ProtDrive:  DC.L    0           ; Position: -16(NewHdvRW)
  191.  
  192. *
  193. * XBRA-Struktur
  194. *
  195. XBRA:       DC.B    "XBRA"      ; Position: -12(NewHdvRW)
  196. Ident:      DC.B    "WPRO"      ; Position: -8(NewHdvRW)
  197. ; alter hdv_rw-Vektor
  198. OldHdvRW:   DC.L    0           ; Position: -4(NewHdvRW)
  199.  
  200. * Neuer hdv_rw-Vektor
  201. NewHdvRW:
  202. ProtDriveOffs   EQU   ProtDrive   - *
  203. AutoBootDrvOffs EQU   AutoBootDrv - *
  204.  
  205.             movem.l d1-a6,RegSave
  206.  
  207.             btst.b  #0,5(sp)    ; Read-Write-Flag
  208.             beq.s   gotoOld     ; es wird nur gelesen
  209.  
  210.             move.w  14(sp),d3   ; Laufwerk 0=A:, 1=B: etc.
  211.             move.l  _drvbits.w,d4
  212.             btst.l  d3,d4       ; gibt's das Laufwerk überhaupt ?
  213.             beq.s   gotoOld     ; nein
  214.             move.l  ProtDrive(pc),d4
  215.             btst.l  d3,d4       ; soll Laufwerk geschützt werden ?
  216.             beq.s   gotoOld     ; nein
  217.     .loop:  moveq   #WRITE_PROTECT,d0
  218.           ; D3-D7 / A3-A6 werden vom Critical-Error-Handler gerettet
  219.             bsr.s   CallCritErr ; critical-error-handler aufrufen
  220.             cmp.l   #$10000,d0  ; Retry ?
  221.             bne.s   .wpro
  222.  
  223.           ; Bei Linksshift+Button[Nochmal] wird der Laufwerksschutz
  224.           ; für das betreffende Laufwerk aufgehoben
  225.             lea     $E1B.w,a1          ; Vorannahme TOS 1.00
  226.             move.l  $4F2.w,a0          ; _sysbase
  227.           ; TOS >= 1.02?
  228.             cmp.w   #$102,2(a0)
  229.             bcs.s   .tos10
  230.             move.l  $24(a0),a1         ; *pkbshift
  231.           ; LinksShift gedrückt?
  232.     .tos10: cmp.b   #2,(a1)
  233.             bne.s   .loop
  234.           ; Laufwerksschutz aufheben
  235.             move.w  14(sp),d3   ; Laufwerk 0=A:, 1=B: etc.
  236.             move.l  ProtDrive(pc),d4
  237.             bclr    d3,d4
  238.             move.l  d4,ProtDrive
  239.             bra.s   gotoOld
  240.  
  241.      .wpro: movem.l RegSave(pc),d1-a6
  242.             moveq   #WRITE_PROTECT,d0
  243.             rts
  244. gotoOld:    movem.l RegSave(pc),d1-a6
  245.             move.l  OldHdvRW(pc),-(sp)
  246.             rts
  247.  
  248. CallCritErr:move.w  d3,-(sp)    ; Laufwerk
  249.             move.w  d0,-(sp)    ; Fehlercode
  250.             moveq   #-1,d0      ; Kompatibilität zum Bios
  251.             move.l  $404.w,a0   ; etv_critic
  252.             jsr     (a0)
  253.             addq.w  #4,sp
  254.             rts
  255.  
  256. RegSave:    .DCB.L   14,0 ; D1-D7/a0-a6
  257.  
  258. AutoResident    EQU     *
  259. *----------------------------
  260.  
  261. *
  262. * Resource einbinden
  263. *
  264.             .include "WPRORSC.S"
  265.  
  266. AESPB:      DC.L    control, global, intin, intout, addrin, addrout
  267.  
  268. NotResident:DC.B    "[1][WProtect 1.03:|Bleibe nicht resident.][Ok]",0
  269.             .even
  270.  
  271. AlertNotInstalled:
  272.             DC.B    "[1][WProtect 1.03:|Bitte installieren!][Ok]",0
  273.             .even
  274.  
  275. Widmung:    DC.B    "[0][~~~~~~~~~~~~~~~  |  Widmung  an|    Barbara|"
  276.             DC.B    "~~~~~~~~~~~~~~~  ][ Ok ]",0
  277.             .even
  278.  
  279. NoCookie:   DC.B    "[1][WProtect 1.03:|Kann keinen Cookie anlegen.][Ok]",0
  280.             .even
  281.  
  282. AlertBootProt:
  283.             DC.B    "[2][WProtect 1.03:|Laufwerk "
  284. AlertBootDrv:
  285.             DC.B    0," ist geschützt.|Trotzdem sichern?]"
  286.             DC.B    "[Ok|Abbruch]",0
  287.             .even
  288.  
  289. Menu_entry: DC.B    "  ",3," WProtect 1.03  ",0
  290.             .even
  291.  
  292. FileError:  DC.B    "[1][ Dateifehler beim Speichern | auf "
  293. FileErrDrv: DC.B    "X:\\WPROTECT.INF!][ Ok ]",0
  294.             .even
  295.  
  296. FName:      DC.B    "X:\\WPROTECT.INF",0   ; 1. Byte == Laufwerk
  297.             .even
  298.  
  299. * Worte für's control-Feld
  300. * contrl[0..4] = opcode / #intin / #intout / #addrin / #addrout
  301. * O-Ton Profibuch 10te Auflage:
  302. * "Darüber, welche Werte vor einem AES-Aufruf gesetzt werden müssen, gibt es
  303. * keine klaren Informationen. Nötig ist es auf jeden Fall für contrl[0],
  304. * contrl[1] und contrl[3]. Wenig sinnvoll erscheint es für contrl[2] und
  305. * contrl[4] - schliesslich wissen ja die AES-Funktionen selbst, wie viele
  306. * Werte sie in den Ausgabefeldern zurückliefern.
  307. * Die mit dem Original-Entwicklungspaket mitgelieferten Bindings [...] setzen
  308. * allerdings alle Werte des Arrays."
  309. * ...und tatsächlich: Unterlasse ich das Vorbesetzen von contrl[2] und
  310. * contrl[4] funktioniert der Aufruf über Anklicken der Accessory-Menüleiste
  311. * nicht mehr.
  312. ApplicationInit:
  313.             DC.W    10,0,1,0,0
  314. ApplExit:   DC.W    19,0,1,0,0
  315. EvntMesag:  DC.W    23,0,1,1,0
  316. MenuRegister:DC.W  35,1,1,1,0
  317.  
  318. FormAlert:  DC.W    52,1,1,1,0
  319. FormDo:     DC.W    50,1,1,1,0
  320. FormDial:   DC.W    51,9,1,0,0
  321. FormCenter: DC.W    54,0,5,1,0
  322.  
  323. GrafMouse:  DC.W    78,1,1,1,0
  324. WindUpdate: DC.W    107,1,1,0,0
  325.  
  326. RSRCObFix:  DC.W    114,1,1,1,0
  327.  
  328. OBJC_Change:DC.W    47,8,1,1,0
  329. OBJC_Draw:  DC.W    42,6,1,1,0
  330.  
  331.            .BSS
  332. control:    DS.W    12
  333. global:     DS.W    15
  334. intin:      DS.W    128
  335. intout:     DS.W    128
  336. addrin:     DS.W    128
  337. addrout:    DS.W    128
  338.  
  339. CurrentVec: DS.L    1   ; NewHdvRW-Vektor
  340. Installed:  DS.B    1   ; 0 : Installiert !
  341. Accessory:  DS.B    1   ; Falls 0 -> Accessory
  342. * beim Abspeichern von ProtDrive darf das Laufwerk, auf dem
  343. * gespeichert wird, nicht geschützt sein. ProtDouble dient als
  344. * Buffer, während in ProtDrive das entsprechende Bit gelöscht wird
  345. ProtDouble: DS.L    1
  346. BootDrv:    DS.W    1
  347. ActDrive:   DS.B    1   ; Aktuell zu bearbeitendes Laufwerk
  348. DrvBits:    DS.L    1   ; Kopie von _drvbits ($4C2)
  349. Keep:       DS.L    1
  350.  
  351. * Per FormCenter ermittelte zentrierte Koordinaten der Dialogbox
  352. xClip:      DS.W    1
  353. yClip:      DS.W    1
  354. wClip:      DS.W    1
  355. hClip:      DS.W    1
  356.  
  357. MsgBuf:     DS.B    16  ; Nachrichtenbuffer AES
  358.  
  359.             DS.B    $190    ; 400 Byte Stack reichen dicke
  360. Stack       EQU     *
  361.  
  362.  
  363.            .TEXT
  364. *-------------------------
  365. ObjcChange:
  366. * Vorzubesetzen sind
  367. * intin     Objektnummer
  368. * intin+12  newstate
  369. * intin+14  (0) 1 = (nicht) neuzeichnen
  370. * Parameterfelder für OBJC_Change setzen
  371.             clr.w   intin+2         ; reserved
  372.           ; Clipping setzen (quasi abschalten)
  373.             clr.l   intin+4
  374.             move.l  #$7FFF7FFF,intin+8
  375.  
  376.             move.l  #Objc000000,addrin ; Objektbaumadresse
  377.             AES     OBJC_Change
  378.             rts
  379.  
  380. ObFixCenter:
  381. * Anpassung Koordinaten Zeichen- in Pixeldarstellung
  382.             move.l  #Objc000000,addrin
  383.             move.w  #OBJCs000-1,d3
  384.  
  385.   .convert: move.w  d3,intin
  386.             AES     RSRCObFix
  387.             dbra    d3,.convert
  388.             rts
  389.  
  390. DialogInit: move.l  #Objc000000,addrin
  391.             AES     FormCenter
  392.             move.l  intout+2,xClip
  393.             move.l  intout+6,wClip
  394.  
  395.             SupExec GetDrvBits
  396.             move.l  DrvBits,d4
  397.             move.l  ProtDrive(pc),d5
  398.             move.w  #NrOfDrives-1,d3      ; 26 Laufwerke testen
  399.  
  400.             clr.w   intin+14    ; nicht neuzeichnen
  401.  
  402.      .loop: btst.l  d3,d4       ; gibt's das Laufwerk überhaupt ?
  403.             bne.s   .protect    ; ja
  404.  
  405.             move.w  #8,intin+12     ; DISABLED
  406.  
  407.             bra.s   .change
  408.  
  409.   .protect: btst.l  d3,d5           ; soll Laufwerk geschützt werden ?
  410.             bne.s   .prot           ; ja
  411.             clr.w   intin+12        ; NOT SELECTED
  412.             bra.s   .change
  413.  
  414.      .prot: move.w  #1,intin+12     ; SELECTED
  415.  
  416.    .change: move.w  d3,d6
  417.             addq.w  #DRIVEA,d6
  418.             move.w  d6,intin        ; Objektnummer
  419.             bsr     ObjcChange
  420.     .loop1: dbra    d3,.loop
  421.  
  422.             move.w  #1,intin        ; BEG_UPDATE
  423.             AES     WindUpdate
  424.  
  425. DrawDialog: clr.w   intin           ; Mauszeiger als Pfeil
  426.             AES     GrafMouse
  427.  
  428.             clr.w   intin           ; FMD_START
  429.             clr.l   intin+2
  430.             clr.l   intin+6
  431.             move.l  xClip,intin+10
  432.             move.l  wClip,intin+14
  433.             AES     FormDial
  434.  
  435.             clr.w   intin           ; Startobjekt 0
  436.             move.w  #8,intin+2      ; Alle Objektebenen zeichnen
  437.             move.l  xClip,intin+4
  438.             move.l  wClip,intin+8
  439.             AES     OBJC_Draw
  440.  
  441. Dialog:     clr.w   intin
  442.             move.l  #Objc000000,addrin ; Objektbaumadresse
  443.             AES     FormDo
  444.             move.w  intout,d0
  445.  
  446.             cmp.w   #WIDMUNG,d0
  447.             bne.s   .weiter
  448.             ZeigeAlert Widmung
  449.             move.w  #WIDMUNG,intin
  450.    .change: clr.w   intin+12
  451.             move.w  #1,intin+14
  452.             bsr     ObjcChange
  453.             bra.s   Dialog
  454.  
  455.    .weiter: cmp.w   #EXIT,d0
  456.             beq.s   ExitButton
  457.  
  458.             cmp.w   #SAVE,d0
  459.             bne.s   IsOk?
  460.             bsr     SaveConfig
  461.             move.w  #SAVE,intin
  462.             bra.s   .change
  463.  
  464.      IsOk?: cmp.w   #OK,d0
  465.             beq.s   OkButton
  466.  
  467.             bra     Dialog
  468. *------------------------
  469. NewProtDrv: lea     Objc000000(pc),a0   ; Objektbaumadresse
  470.             move.w  #DRIVEA+NrOfDrives-1,d0
  471.             mulu    #24,d0
  472.             adda.l  d0,a0
  473.  
  474.             move.w  #NrOfDrives-1,d0
  475.             clr.l   d1                 ; Default: alle deselektiert
  476.  
  477. * Laufwerke durchgehen
  478.      .test: btst.b  #0,11(a0)          ; Selected?
  479.             beq.s   .weiter            ; nein
  480.             bset.l  d0,d1
  481.    .weiter: suba.l  #24,a0             ; nächstes Objekt
  482.             dbra    d0,.test
  483.             rts
  484.  
  485. OkButton:   move.w  d0,intin
  486.             clr.l   intin+12
  487.             bsr     ObjcChange
  488.  
  489.             bsr     NewProtDrv
  490.  
  491.             move.l  CurrentVec,a0    ; die neuen Schutzwerte übernehmen
  492.             move.l  d1,ProtDriveOffs(a0)
  493.  
  494. ExitButton: move.w  d0,intin
  495.             clr.l   intin+12
  496.             bsr     ObjcChange
  497.  
  498.             move.w  #3,intin        ; FMD_FINISH
  499.             clr.l   intin+2
  500.             clr.l   intin+6
  501.             move.l  xClip,intin+10
  502.             move.l  wClip,intin+14
  503.             AES     FormDial
  504.  
  505.             clr.w   intin           ; END_UPDATE
  506.             AES     WindUpdate
  507.  
  508.     IsAcc?: tst.b   Accessory
  509.             beq     WaitForAC_OPEN
  510.  
  511. * Wir sind ein Programm!
  512.             tst.b   Installed
  513.             bne.s   .Protected?     ; brancht falls NICHT installiert
  514.             bra.s   .terminate
  515.  
  516. *
  517. * Wir sind ein Programm und nicht installiert
  518. *
  519. * Sind überhaupt irgendwelche Laufwerke zum Schützen gekennzeichnet worden ?
  520. * Falls nicht, brauchen wir nicht resident zu bleiben
  521. .Protected?:tst.l   ProtDrive
  522.             bne.s   .install
  523.  
  524.             ZeigeAlert NotResident
  525.  
  526.         ; ApplExit - Vom AES abmelden
  527. .terminate: AES     ApplExit
  528.  
  529.             GEMDOS  0               ; PTerm
  530.  
  531.   .install: SupExec InstallVecs
  532.             bne.s   .raus
  533.             ZeigeAlert NoCookie
  534.             bra.s   .terminate
  535.  
  536.         ; ApplExit - Vom AES abmelden
  537.      .raus: AES     ApplExit
  538.             SupExec Get_bootdev
  539.             move.w  BootDrv,AutoBootDrv
  540.  
  541.             clr.w   -(sp)
  542.             pea     AutoResident-Anfang+$100
  543.             GEMDOS  49
  544.  
  545.  
  546. WaitForAC_OPEN:
  547.         ; EvntMesag - auf Mitteilung warten
  548.             move.l  #MsgBuf,addrin
  549.             AES     EvntMesag
  550.  
  551.             cmp.w   #40,MsgBuf            ; AC_OPEN
  552.             beq.s   .test
  553.             cmp.w   #$4711,MsgBuf         ; VA_START (Gemini)
  554.             bne.s   WaitForAC_OPEN
  555.  
  556. * Falls Accessory ohne installiertes Autoordnerprogramm gestartet
  557. * immer mal wieder nachschauen ob nicht inzwischen über WPROTECT.PRG
  558. * (nachträglich gestartet) ein residentes WProtect drin ist.
  559.      .test: bsr     IsInstalled?
  560.  
  561.             tst.b   Installed
  562.             bne.s   AccNotInstEntry   ; Nicht installiert
  563.  
  564.             move.l  CurrentVec,a0
  565.             move.l  ProtDriveOffs(a0),ProtDrive
  566.  
  567.             bra     DialogInit
  568.  
  569. AccNotInstEntry:
  570.           ; Nicht installiert
  571.             ZeigeAlert AlertNotInstalled
  572.  
  573.             bra     WaitForAC_OPEN
  574.  
  575. *-------------------------
  576. CallAES:    movem.l d0-a6,-(sp)
  577.             move.w  (a0)+,control
  578.             move.l  (a0)+,control+2
  579.             move.l  (a0),control+6
  580.             move.l  #AESPB,d1
  581.             move.w  #200,d0
  582.             trap    #2
  583.             movem.l (sp)+,d0-a6
  584.             rts
  585.  
  586. *-----------------------------------
  587. Install:
  588. * Offiziell dokumentiert:
  589. * Bei Accessories steht in a0 ein Zeiger auf die Basepage.
  590. * Sonst (alles ausser Accessories) ist a0 == 0.
  591.             cmpa.l  #0,a0       ; Basepageadresse in a0?
  592.             seq     Accessory   ; Nein ---> Wir sind ein Programm
  593.             bne.s   .weiter0
  594.             move.l  4(sp),a0    ; Basepageadresse
  595.  
  596.   .weiter0: move.l  #Stack,sp
  597.             tst.b   Accessory
  598.             beq.s   .cookie
  599.  
  600.             lea     Stack,a1
  601.             suba.l  a0,a1
  602.             move.l  a1,Keep     ; Anzahl evt. resident zu haltender Bytes
  603.  
  604.             move.l  Keep,-(sp)
  605.             pea     (a0)        ; ab Basepage
  606.             clr.w   -(sp)       ; Dummy
  607.             GEMDOS  74,10       ; MShrink
  608.  
  609. ** Cookietest - sind wir schonmal installiert ?
  610.    .cookie: bsr     IsInstalled?
  611.  
  612. *-------------------------------------------------------------
  613. ** Beim AES anmelden
  614.             clr.w   global
  615.             AES     ApplicationInit
  616.             tst.w   global
  617.           ; global[0] (GEM-Version) wurde ja vorher auf 0 gesetzt
  618.           ; falls immer noch 0 kann das AES noch nicht initialisiert sein
  619.           ; d.h. wir sind im AUTO-Ordner
  620.             beq.s   AutoOrd
  621.  
  622.             tst.b   Accessory
  623.             bne.s   .weiter                  ; bne -> Programm
  624.  
  625. ** MenuRegister - In die Menüzeile eintragen
  626.             move.w  intout,intin
  627.             move.l  #Menu_entry,addrin
  628.             AES     MenuRegister
  629.  
  630.    .weiter: bsr     ObFixCenter
  631.             tst.b   Accessory
  632.             bne     DialogInit               ; Programm
  633.             tst.b   Installed
  634.             beq     WaitForAC_OPEN
  635.             bra     AccNotInstEntry          ; Accessory
  636.  
  637. *--------------------------------------------------------
  638. ; Auto-Ordner-Programm
  639. AutoOrd:    tst.b   Installed
  640.             bne.s   .install
  641.             move.l  CurrentVec,a0
  642.             move.l  ProtDrive(pc),ProtDriveOffs(a0)
  643. .terminate: GEMDOS  0               ; PTerm
  644.  
  645.   .install: SupExec InstallVecs
  646.             bne.s   .weiter
  647.  
  648.             pea     AutoInf1(pc)
  649.             GEMDOS  9,4
  650.  
  651.             bra.s   .terminate
  652.  
  653.    .weiter: GEMDOS  25,0            ; DGetDrv, aktuelles Laufwerk
  654.             move.w  d0,AutoBootDrv
  655.  
  656.             bsr     ReadConfig
  657.  
  658.             pea     AutoInf0(pc)
  659.             GEMDOS  9,4
  660.  
  661. *----------
  662.             move.l  ProtDrive(pc),d7
  663.             beq.s   .raus
  664.  
  665.             pea     ProtectStr(pc)
  666.             GEMDOS  9,4
  667.  
  668.             clr.w   d5
  669.             lea     Drives+1(pc),a3
  670.      .test: btst    d5,d7
  671.             beq.s   .loopD
  672.             move    d5,d6
  673.             addi.b  #'A',d6
  674.             move.b  d6,(a3)
  675.  
  676.             pea     Drives(pc)
  677.             GEMDOS  9,4
  678.  
  679.     .loopD: addq.w  #1,d5
  680.             cmp.b   #NrOfDrives,d5
  681.             blt.s   .test
  682. *----------
  683.  
  684.      .raus: pea     CRLFCRLF(pc)
  685.             GEMDOS  9,4
  686.  
  687.             clr.w   -(sp)
  688.             pea     AutoResident-Anfang+$100
  689.             GEMDOS  49
  690.  
  691. Drives:     DC.B    " A",0
  692. ProtectStr: DC.B    " Schütze: ",0
  693. AutoInf0:   DC.B    13,10,"*** WProtect 1.03 RESIDENT.",0
  694. CRLFCRLF:   DC.B    13,10,13,10,0
  695. AutoInf1:   DC.B    "*** WProtect 1.03: kein COOKIE anlegbar.",13,10
  696.             DC.B    "***                NICHT RESIDENT!",13,10,0
  697.             .even
  698.  
  699. *----------------------
  700.  
  701. * Bitstring der angemeldeten Laufwerke holen
  702. GetDrvBits: move.l  _drvbits.w,DrvBits       ; angemeldete Laufwerke
  703.             rts
  704.  
  705. *-------------------
  706.  
  707. **** Per XBios(38) im Supervisormode ausgeführte Funktionen
  708. SupExec:    pea     (a0)
  709.             move.w  #38,-(sp)
  710.             trap    #14
  711.             addq.w  #6,sp
  712.             rts
  713.  
  714. *----------------------------------------------------
  715. *  IN: -
  716. * OUT: d0.w == 0 Installation schlug fehl
  717. InstallVecs:move.l  #'WPRO',d0
  718.             move.l  #NewHdvRW,d1
  719.             bsr     CK_WriteJar
  720.             tst.w   d0
  721.             beq.s   .return
  722.  
  723.             move.l  hdv_rw.w,OldHdvRW
  724.             move.l  #NewHdvRW,hdv_rw.w
  725.    .return: rts
  726.  
  727. Get_bootdev:tst.b   Installed
  728.             beq.s   .weiter
  729.             move.w  _bootdev.w,BootDrv
  730.             rts
  731.    .weiter: move.l  CurrentVec,a0
  732.             move.w  AutoBootDrvOffs(a0),BootDrv
  733.             rts
  734.  
  735. *-------------------
  736. SaveConfig:
  737. * Sichern der Konfiguration
  738.             bsr     NewProtDrv
  739.             move.l  d1,d4
  740.             move.l  d1,ProtDrive
  741.  
  742.         ; ProtDrive zum Sichern retten
  743.             move.l  ProtDrive(pc),ProtDouble
  744.  
  745.             SupExec Get_bootdev
  746.             move.w  BootDrv,d3
  747.  
  748.         ; das Laufwerk, auf dem gesichert wird, darf nicht als
  749.         ; geschützt gelten
  750.             bclr.l  d3,d4
  751.             beq.s   .noprot            ; war nicht geschützt
  752.  
  753. * Bei geschütztem Bootlaufwerk nochmal nachfragen,
  754. * ob wirklich gesichert werden soll!
  755.             move.b  d3,AlertBootDrv
  756.             addi.b  #'A',AlertBootDrv
  757.             ZeigeAlert AlertBootProt
  758.  
  759.             cmpi.w  #2,intout
  760.             beq     SaveRet
  761.  
  762.    .noprot: move.l  CurrentVec,a0
  763.             move.l  d4,ProtDriveOffs(a0)
  764.             addi.b  #'A',d3
  765.  
  766.             lea     FName(pc),a0   ; 'X:\\WPROTECT.INF'
  767.             move.b  d3,(a0)
  768.             move.b  d3,FileErrDrv
  769.  
  770.           ; FCreate
  771.             clr.w   -(sp)
  772.             pea     (a0)
  773.             GEMDOS  60,6
  774.             tst.w   d0
  775.             bmi     FileErr
  776.  
  777.           ; D3 wird bei GemDos-Aufrufen automatisch gerettet
  778.             move.w  d0,d3
  779.  
  780.           ; FWrite
  781.             pea     ProtDouble
  782.             pea     4
  783.             move.w  d3,-(sp)
  784.             GEMDOS  64,10
  785.             tst.w   d0
  786.             bmi.s   FileErr
  787.  
  788.             bsr     FClose
  789.  
  790.             move.l  ProtDouble,ProtDrive
  791.             move.l  CurrentVec,a0
  792.             move.l  ProtDrive(pc),ProtDriveOffs(a0)
  793. SaveRet:    rts
  794.  
  795. *-------------------
  796. ReadConfig:
  797. * Einlesen der Konfiguration
  798.             SupExec Get_bootdev
  799.             move.w  BootDrv,d3
  800.             addi.b  #'A',d3
  801.  
  802.             lea     FName(pc),a0   ; 'X:\\WPROTECT.INF'
  803.             move.b  d3,(a0)
  804.  
  805.           ; FOpen
  806.             move.w  #1,-(sp)
  807.             pea     (a0)
  808.             GEMDOS  61,6
  809.             tst.w   d0
  810.             bmi     ReadErrAuto
  811.  
  812.           ; D3 wird bei GemDos-Aufrufen automatisch gerettet
  813.             move.w  d0,d3
  814.  
  815.           ; FRead
  816.             pea     ProtDrive(pc)
  817.             pea     4
  818.             move.w  d3,-(sp)
  819.             GEMDOS  63,10
  820.             tst.w   d0
  821.             bpl.s   FClose
  822.  
  823.             bsr     ReadErrAuto
  824.             bra.s   FClose
  825.  
  826. *--------------------------------------------------
  827. * Ein Dateifehler ist aufgetreten
  828.    FileErr:ZeigeAlert FileError
  829.    FClose: move.w  d3,-(sp)
  830.            GEMDOS  62,2
  831.            rts
  832.  
  833. *--------------------------------------------------
  834. CookieVal:  DC.L    0
  835. IsInstalled?:
  836.           ; Ab in den Supervisormode
  837.             pea     0
  838.             GEMDOS  32,4
  839.             move.l  d0,-(sp)
  840.  
  841.             move.l  #'WPRO',d0
  842.             lea     CookieVal(pc),a0
  843.             bsr     CK_ReadJar
  844.             tst.w   d0
  845.             seq     Installed
  846.             bne.s   .installed
  847.             move.l  #NewHdvRW,CurrentVec
  848.             bra.s   .weiter
  849.  
  850. .installed: move.l  CookieVal(pc),a0
  851.             move.l  a0,CurrentVec
  852.             move.l  ProtDriveOffs(a0),ProtDrive
  853.  
  854.           ; Zurück in den Usermode
  855.    .weiter: GEMDOS  32,4
  856.             rts
  857.  
  858. ReadErr:    DC.B    "*** WProtect 1.03: "
  859.             DC.B    "Fehler beim Lesen der Konfiguration!",13,10
  860.             DC.B    "Bleibe resident!",0
  861. ReadErrAuto:pea     ReadErr(pc)
  862.             GEMDOS  9,4
  863.             rts
  864.  
  865.            .include "COOKIE.S"
  866.  
  867.            .END
  868.